from functools import wraps


def trace(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(f'{func.__name__}({args!r}, {kwargs!r} -> {result!r})')
        return result
    return wrapper


@trace
def fibonacci(n):
    """Return the n-th Fibonacci number."""
    if n in set([0, 1]):
        return n
    return fibonacci(n - 2) + fibonacci(n - 1)


if '__main__' == __name__:
    fibonacci(4)
